package com.simpou.commons.utils.lang;

import com.simpou.commons.utils.pagination.PageLimits;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;


/**
 * Operações úteis sobre coleções.
 *
 * @author Jonas Pereira
 * @since 2013-02-09
 */
public class CollectionsHelper {
    /**
     * Compara dois Sets. São considerados iguais se os mesmos elementos do
     * primeiro estiverem contidos no segundo e vice-versa, ou seja, devem
     * conter os mesmos elementos independente de suas posições.
     *
     * Também são considerados iguais se ambos forem null.
     *
     * @param set1 Primeiro conjunto.
     * @param set2 Segundo conjunto.
     * @return true se forem iguais.
     */
    public static boolean equals(final Set<?> set1, final Set<?> set2) {
        if (set1 == null) {
            return set2 == null;
        }

        if (set2 == null) {
            return false;
        }

        if (set1.size() != set2.size()) {
            return false;
        }

        for (Object item : set1) {
            if (!set2.contains(item)) {
                return false;
            }
        }

        return true;
    }
    
    /**
     * @param list Lista.
     * @param limits Limites da sublista baseado na lista.
     * @return Sublista.
     */
    public static <T> List<T> subList(final List<T> list, final PageLimits limits){
        List<T> subList = new ArrayList<T>(limits.getSize());
        final int last = Math.min(limits.getLast()+1, list.size());
        for (int i = limits.getFirst(); i < last; i++) {
            subList.add(list.get(i));
        }
        return Collections.unmodifiableList(subList);
    }
    
    /**
     * @param list Lista onde será buscado um elemento,
     * @param object Objeto a ser procurado.
     * @return Posição do objeto na lista ou -1 se não encontrado.
     */
    public static <T> int search(final List<T> list, final T object){
        int count = 0;
        for (T t : list) {
            if(t.equals(object)){
                return count;
            }
            count++;
        }
        return -1;
    }
    
}
